home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 46 / Amiga Format CD46 (1999-10-20)(Future Publishing)(GB)[!][issue 1999-12].iso / -serious- / comms / www / urlx / treecat.c < prev    next >
C/C++ Source or Header  |  1999-09-06  |  2KB  |  128 lines

  1. /*
  2.  *  treecat
  3.  */
  4.  
  5. #include <sys/types.h>
  6. #include <sys/dir.h>
  7. #include <sys/stat.h>
  8.  
  9. #include <stdio.h>
  10.  
  11. #define BUFSIZE 65536
  12.  
  13. char buf[1024];
  14. char data[BUFSIZE];
  15.  
  16. int verbose_f;
  17.  
  18. struct stat st;
  19.  
  20. void scan_dir(char *path, int pathlen)
  21. {
  22.   DIR *dir;
  23.   struct direct *dirent;
  24.   int oldpathlen;
  25.  
  26.   oldpathlen = pathlen;
  27.  
  28.   if (!(dir = opendir(path)))
  29.   {
  30.     printf("couldn't open directory '%s'\n", path);
  31.     return;
  32.   }
  33.  
  34. #ifdef amigaos
  35.   if (pathlen && path[pathlen - 1] != ':' && path[pathlen - 1] != '/')
  36. #endif
  37.   path[pathlen++] = '/';
  38.  
  39.   while (dirent = readdir(dir))
  40.   {
  41.     memcpy(path + pathlen, dirent->d_name, dirent->d_namlen);
  42.     path[pathlen + dirent->d_namlen] = 0;
  43.  
  44.     if (stat(path, &st) == 0)
  45.     {
  46.       if ((st.st_mode & S_IFMT) == S_IFDIR)
  47.       {
  48.         scan_dir(path, pathlen + dirent->d_namlen);
  49.       }
  50.       else
  51.       {
  52.         /*
  53.          *  file ops go here
  54.          */
  55.  
  56.         /*
  57.          *  open each file in turn
  58.          */
  59.         {
  60.           FILE *fp = 0;
  61.  
  62.           if (verbose_f)
  63.             fprintf(stderr, "%s\n", path);
  64.  
  65.           if (fp = fopen(path, "rb"))
  66.           {
  67.             int datalen;
  68.  
  69.             while (datalen = fread(data, 1, BUFSIZE, fp))
  70.             {
  71.               fwrite(data, 1, datalen, stdout);
  72.             }
  73.  
  74.             fclose(fp);
  75.           }
  76.         }
  77.       }
  78.     }
  79.     else
  80.       printf("no stat for %s\n", path);
  81.   }
  82.  
  83.   path[oldpathlen] = 0;
  84.  
  85.   closedir(dir);
  86.  
  87.   /*
  88.    *  directory ops would go here
  89.    */
  90. }
  91.  
  92. usage()
  93. {
  94.   printf("usage: treecat <directoryname>\n");
  95.   exit(0);
  96. }
  97.  
  98. main(int argc, char **argv)
  99. {
  100.   int i, patharg = 0;
  101.  
  102.   verbose_f = 0;
  103.  
  104.   for (i = 1; i < argc; i++)
  105.   {
  106.     if (argv[i][0] == '-')
  107.     {
  108.       switch (argv[i][1])
  109.       {
  110.       case 'v': verbose_f++; break;
  111.       default: usage();
  112.       }
  113.     }
  114.     else if (patharg == 0)
  115.       patharg = i;
  116.     else
  117.       usage();
  118.   }
  119.   if (patharg == 0)
  120.     usage();
  121.  
  122.   strcpy(buf, argv[patharg]);
  123.  
  124.   scan_dir(buf, strlen(buf));
  125.  
  126.   return (0);
  127. }
  128.